package displayboardinfo.utils;

import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.ArrayList;
import java.util.Iterator;

import org.apache.commons.codec.binary.Base64;
import org.hibernate.Hibernate;
import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;

import displayboardinfo.entities.Admission;
import displayboardinfo.entities.RegisteredForUpdates;
import displayboardinfo.entities.Room;

/**
 * Klasa udostępniająca metody "narzędziowe".
 * 
 * @author Artur Jaworski
 */
public class Utils {
	/**
	 * Konwersja łańcucha znaków do hasha SHA1.
	 * Metody używana do bezpiecznego przesyłania hasła w formie niejawnej.
	 * 
	 * @param string łańcuch do zakodowania
	 * @return hash SHA1 z łańcucha
	 */
	public static String convertToSHA1(String string){
		try {
			String sha1 = null;
			
			byte[] buffer = string.getBytes();
			MessageDigest algorithm = MessageDigest.getInstance("SHA-1");
			algorithm.reset();
			algorithm.update(buffer);
			byte[] digest = algorithm.digest();
			sha1 = Base64.encodeBase64String(digest);
		
			return sha1;
		} catch (NoSuchAlgorithmException e) {
			e.printStackTrace();
			return null;
		}
		
	}
	
	/**
	 * Listowanie klientów zarejestrowanych na aktualizacje danego gabinetu.
	 * 
	 * @param room gabinet, którego lista zarejestrowanych klientów ma zostać zwrócona
	 * @return lista klientów zarejestrowanych na aktualizacje gabinetu
	 */
	@SuppressWarnings({ "deprecation", "rawtypes" })
	public static ArrayList<RegisteredForUpdates> listRegistered(Room room) {
		SessionFactory sf = new Configuration().configure()
				.buildSessionFactory();
		Session session = sf.openSession();
		ArrayList<RegisteredForUpdates> result = new ArrayList<RegisteredForUpdates>();
		
		Query query = session
				.createQuery(
						"from RegisteredForUpdates r where r.room = :room")
				.setParameter("room", room);

		for (Iterator it = query.iterate(); it.hasNext();) {
			Object item = it.next();

			RegisteredForUpdates registered = (RegisteredForUpdates) item;
			Hibernate.initialize(registered);
			registered.setRoom(null);
			result.add(registered);
		}

		session.close();
		sf.close();
		return result;

	}
	
	/**
	 * Listowanie okresów przyjęć w konkretnym gabinecie.
	 * 
	 * @param room gabinet, którego lista okresów przyjęć ma zostać zwrócona
	 * @return lista okresów przyjęć gabinetu
	 */
	@SuppressWarnings({ "deprecation", "rawtypes" })
	public static ArrayList<Admission> listAdmissions(Room room) {
		SessionFactory sf = new Configuration().configure()
				.buildSessionFactory();
		Session session = sf.openSession();
		ArrayList<Admission> result = new ArrayList<Admission>();
		
		Query query = session
				.createQuery(
						"from Admission a where a.room = :room")
				.setParameter("room", room);

		for (Iterator it = query.iterate(); it.hasNext();) {
			Object item = it.next();

			Admission adm = (Admission) item;
			Hibernate.initialize(adm);
			adm.setRoom(null);
			adm.setUser(null);
			result.add(adm);
		}

		session.close();
		sf.close();
		return result;

	}
	
}
